const Koa = require('koa')
const path = require('path')
const cors = require('koa2-cors')
const koaBody = require('koa-body')
const session = require('koa-session')
const router = require('./app/router')
const staticFiles = require('koa-static')
const tools = require('./app/utils/tools')
const config = require('./config/config.default')
const args = tools.getArguments()

const app = new Koa()
// 错误捕获
app.use(async (ctx, next) => {
  try {
    await next()
  } catch (error) {
    console.log(error, '-->>> error')
    ctx.body = { code: 500, msg: '操作异常' }
  }
})
// 日志记录
app.use(async (ctx, next) => {
  const start = new Date()
  await next()
  const ms = new Date() - start
  const sendTime = tools.jcore.parseTime(start, '{h}:{i}:{s}')
  if (!args.includes('-start')) {
    console.log(
      `ip: ${ctx.request.ip} [ ${ctx.method} ${ctx.url} ] time: ${sendTime}`,
      ms,
      'ms'
    )
  }
})
// 跨域设置
app.use(
  cors({
    origin: function (ctx) {
      return ctx.header.origin
    },
    allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 设置所允许的 HTTP请求方法
    credentials: true // 标示该响应是合法的
  })
)
// session 配置
const CONFIG = {
  key: 'sessionId',
  maxAge: 8e7, // cookie 的过期时间 23h,54m
  overwrite: true, // 是否可以 overwrite (默认 default true)
  httpOnly: true, // true 表示只有服务器端可以获取 cookie
  signed: true, // 默认 签名
  rolling: false, // 在每次请求时强行设置 cookie，这将重置 cookie 过期时间（默认：false）
  renew: false // 在每次请求时强行设置 session，这将重置 session 过期时间（默认：false）
}
app.use(session(CONFIG, app))
// 设置静态目录
app.use(staticFiles(path.join(__dirname, './public')))
// 上传设置
app.use(
  koaBody({
    multipart: true,
    formidable: {
      maxFileSize: 200 * 1024 * 1024 // 设置上传文件大小最大限制，默认2M
    }
  })
)
// 加载路由
app.use(router.routes()).use(router.allowedMethods())
// 404页面
app.use(async (ctx, next) => {
  await next()
  if (parseInt(ctx.status) === 404) {
    ctx.body = tools.file.readFileSync('./public/view/404.html')
  }
})
// 打印欢迎信息
function welcome() {
  console.log(`- Local:     http://localhost:${config.port}\n- Network:   http://${tools.getIPAddress()}:${config.port}`)
}
// 启动服务
app.listen(config.port, welcome)
